Tiny FORTRAN FORM ――――――――――――――――――――――――――――――――――――――― I/O 1980年 5、6、7、8、9月号掲載 MZ−80 マシン語 起動方法 モニタからロード ――――――――――――――――――――――――――――――――――――――― [2]FORMの使い方 先月号で紹介したFORMの最終仕様と製品ができましたので、 今月はダンプ・リストと使用方法を述べます。 先月号では『FORMにはエディタがない』と述べましたが、 色々と検討の末、本体にエディタを入れることとしました。 したがって、エディタの部分だけオブジェクトが長くなりましたが、 使いやすいシステムになりました。 ――――――――――――――――――― 1 FORM ――――――――――――――――――― FORMが起動されると。 ・――――――――――――――――――――――――――・ | ** FORM(VER1.0)HUDSON ** | | OK.                      | |                          | |                          | ・――――――――――――――――――――――――――・ OKのメッセージが出て、入力待ちになります。 このモードはコンパイラが起動されている状態です。 ここでコンパイラ・レベルの各種のコマンドが受け付けられます。 ――――――――――――――――――― 2 コンパイラのコマンド ――――――――――――――――――― コンパイラ・モードで受け付けられるコマンドは11種類あります。 (1)EDIT   このコマンドは内蔵されているエディタにジャンプします。   エディタの説明は後にします。   ・―――――――――――――――――・   | EDIT [CR]        |   ・―――――――――――――――――・ (2)COMPIL   テキスト・ファイルがメモリ上にある場合に、   そのテキストを読みながらコンパイルします。   コンパイラによって展開されたオブジェクトは   テキスト・エンドから作られていきます。   ・―――――――――――――――――・   | COMPIL [CR]      |   ・―――――――――――――――――・   テキストがない場合、またはEND行がない場合には、   ・―――――――――――――――――――・   | FILE ERROR ABORT! |   ・―――――――――――――――――――・   がでます。 (3)EXEC   カセットにテキストが落ちている場合にこれを読みながら   コンパイルすることができます。   ・―――――――――――――――――――・   | EXEC〔FILE NAME〕[CR] |   | ↓PLAY              |   ・―――――――――――――――――――・   このコマンドを実行すると、   コンパイラはカセットから1ブロックごと読み込んで、   そのつどコンパイルしていきます。   ON MEMORYで、コンパイルしたときに   メモリーエラーが出るような場合には、   いったんカセットにテキストを落としてEXECで実行してください。 (4)BSAVE   COMPILまたはEXECで作ったオブジェクトを   外部へ出力するときにこれを使います。   ・――――――――――――――――――――・   | BSAVE〔FILENAME〕[CR] |   ・――――――――――――――――――――・   BSAVE で作ったテープは、   MZモニタでロードすればオート・スタートします。 (5)LIST指定   COMPIL、EXECによりコンパイルすると、   コンパイラはコンパイルした行を表示します。   LIST指定によって全リストを表示したり、しなかったり、   またエラーのあった行のみ表示することができます。   ●LISTN    コンパイル・リストは表示せず、    エラーの合計とメモリ・サイズを表示します。    初期状態ではこのモードです.   ●LISTE    エラーのなる行のみ出力して、    エラー合計、メモリ・サイズを表示します。   ●LIST    すべてのコンパイル・リストを出力します。   ●LISTP    出力デバイスをプリンタに切り換えます。    LISTP はプリンタ・モードのLISTで、    これの後にLISTN、LISTEを実行すると、    プリンタ・モードのそれになります。    電源が入っていない場合、 UNDEFINEDを返してきます。   ●LISTC    この指定によってプリンタ・モードを解除します。 (6)RUN   コンパイル・オブジェクトを   FORMから直接実行する場合にRUN を使います。   RUN はオブジェクトを単に実行するだけで、   その他の処理は行ないません。   ただ、STOP文、BREAK文 によって、   オブジェクトが停止した場合のみ   FORMコンパイラに戻るようスーパーバイズしています。 (7)BYE  MZモニタヘジャンプします。  ・――――――――――――――――――・  | コールド・スタート  1200H |  | ホット・スタート   122AH |  ・――――――――――――――――――・ ――――――――――――――――――― 3 エディタ ――――――――――――――――――― FORMエディタは、カーソル・エディットができる簡単なエディタです。 画面上にリストが残っていれば、いつでも修正可能です。 メモリ内イメージは、シャープのTEXTエディタと同じく、 CRで区切られた文字列です。 カセットの記録フォーマットも同しなので、 シャープのテキスト・エディタでソースを作って、 コンパイルしてもかまいません。 FORMコンパイラからエディタヘジャンプします。 ・―――――――――――――――――・ | EDIT [CR]        | | #■              | ・―――――――――――――――――・ これによりエディタ・モードを示すために#を出力して、入力待ちになります。 エディタ・コマンドは以下の8個です。  &…NEW     D…DELETE  I…INSERT  !…COMPILER  B…BREAK   R…READ FILE  L…LIST    W…WRITE FILE (1)Insert   Iコマンドは、テキストをインサートするときに使います。   このコマンドは常にテキスト・エンドへインサートします。   [SHIFT][BREAK]を押すことによって、   コマンド・レベルヘ戻ります。   ・―――――――――――――――――・   | #I [CR]          |   | ■               |   ・―――――――――――――――――・ (2)Break   Bコマンドは、行間に1行インサートしたいときに使います。   ・―――――――――――――――――・   | Bn■             |   ・―――――――――――――――――・   nで指定した番号の行は1行下にさがり、その上にインサートされます。   ・―――――――――――――――――・   |#Bn[CR]           |   |strings[CR]       |   |#■               |   ・―――――――――――――――――・   nは、LISTしたときにエディタが付ける番号です。 (3)List   Lコマンドはインサートしたテキストをリストします。   次の3つの型があります。   ・―――――――――――――――――・   |  #L[CR]          |   |  #L,I[CR]        |   |  #L,P[CR]        |   ・―――――――――――――――――・   ●L    テキストの先頭からCRTに表示します。    [SHIFT][BREAK]によって途中で止めることが可能です。   ●L,n    nはLISTしたときに、エディタが付ける番号で、    n番以降のリストを行ないます。    LISTを止めるのはLと同じです。   ●L,P    プリンタにLISTを出力します。    ただし、n番以降のLIST出力はできません。    止める場合はLと同じです。    LISTの画面は次のようになっています。    ・―――――――――――――――――・    |#L [CR]           |    |  0:Strings      |    |  1:Strings      |    |  2:Strings      |    |       |         |    |#■               |    ・―――――――――――――――――・    左側の番号がエディタの付けた番号で、    Stringsはインサートしたテキストです。    番号とテキストの間に『:』が入っています。 (4)Delete   Dコマンドは、1行デリートします。   ・―――――――――――――――――・   | #Dn [CR]         |   ・―――――――――――――――――・   nで指定したテキストが抹消されます。   nはエディタの付けた番号です。 (5)Compile   !コマンドはエディタ・モードを抜け、   コンパイラ・モードヘ移る場合に使います。   ・―――――――――――――――――・   | #! [CR]          |   | OK.             |   | ■               |   ・―――――――――――――――――・ (6)New   &コマンドはテキスト・エリアをクリアし、初期化します。   ・―――――――――――――――――・   | #& [CR]          |   | #■              |   ・―――――――――――――――――・ (7)Read,Write   R、Wコマンドはカセットに対しての入出力用です。   これによってテキスト・レベルでプログラムの保存ができます。   ●R    テキストを読み込みます。    ・――――――――――――――――――・    | #R〔FILE NAME〕[CR] |    ・――――――――――――――――――・    ファイル名は省略可能です。   ●W    メモリにあるテキストをカセットに落します。    ・――――――――――――――――――・    | #W〔FILE NAME〕[CR] |    ・――――――――――――――――――・    ファイル名は省略可能です。 (8)カーソル移動キー   画面にリストが残っていれば、   BASICと同じようにカーソルを動かして修正が可能です。   ただし、Iコマンド実行中はできません。   カーソル・エディットするときは、   エディタが付けた番号と“:”を消さないでください。   これがなくなるとエディタはどのテキストを修正したかがわからなくなり、   コマンド待ちの状態へ戻ります。   [CR]はどこで押してもかまいませんが、   その行の下にテキストがある場合には、   “:”の後にカーソルがなければ、   #を出力してカーソルが点滅し、入力待ちになります。   このエディタは#がないとコマンドを受け付けられません。 ――――――――――――――――――― 4 エディタ・コンパイラ ――――――――――――――――――― ここでは一連の使い方を簡単に説明します。 まず、FORMをスタートさせます。 テキストをカセットで用意していなければ、 EDITでエディタにジャンプします。 #が出ているので、 Iコマンドにより、テキストをインサートしていきます。 テキストのインサートが終了したら、 [SHIFT][BREAK]で、コマンド・レベルヘ戻ります。 Lコマンドを実行し、リストを確認し、間違いがあれば カーソルを移動させ、修正します。 あるいは、D、Bコマンドにより、 行の抹消、インサートを行ないます。 ソース・プログラムを作っているときには、 これらのオペレーションが主な作業となります。 以上の手続きで、ソース・プログラムが完成したならば、 !コマンドでコンパイラに戻ります。 コンパイラ・モードになると、まずLIST指定を行ないます。 初期状態では、LISTN と同等でコンパイル・リストは出力しません。 次にテキストを用意します。 エディタで作ったテキストがメモリ上にある場合はCOMPIL、 カセットの場合にはEXECを実行します。 FORMはテキストを読みながら、そのつどコンパイルしていきます。 LIST指定があれば、そのオペレーションをします。 コンパイルが終了してエラーがなければ、 RUN によってオブジェクトを実行することができます。 ここで修正が必要な場合にはエディタへ戻し、 テキストを修正しコンパイルします。 オブジェクト・レベルでのデバッグは、この繰り返しになります。 このようにしてオブジェクトが完成した場合、 BSAVE によってカセットヘ出力することができます。 このBSAVE で作ったテープは MZモニタよりLOADのみでオート・スタートします。 ――――――――――――――――――― 5 FORMの文法 ――――――――――――――――――― 1)行 (1)注釈行   1桁目に空白以外の文字があると、   その行は注釈行となります(BASICでいうREM文 )。   この行はコンパイルされず、プログラマーに対してのみ意味を持ちます。 (2)END行   END が行として成立するためには、少なくとも、   1個以上の空白がなければいけません。   コンパイラはEND行 を見つけるとコンパイルを停止します。 (3)継続行  FORMではFORTRANでいう継続行はありません。  したがって、複数行を1行と見なすことはできません。 2)文番号 FORMでは、すべての行に番号を付ける必要はありません。 IF文、GOTO文、DO文などで、番号の参照を行なうところのみにつけます。 文番号は1〜65,535までの整数を指定します。 文番号0は存在しないものと解釈します。 3)プログラムの構成 文や行の集まりをプログラムと呼びます。 プログラム中、注釈行はどこに入れても差しつかえなく、 END行 はプログラムの最後になければなりません。 コンパイラは、END行 でプログラム・エンドを知ります。 4)プログラム部分 プログラム部分とは実行文の集まりです。 非実行文はこれに含まず、 少なくとも1つ以上の実行文がなければなりません。 5)プログラム本体 プログラム本体は実行文、宣言文、END行からなり、 END行はプログラム最後に付けます。  プログラム本体中、文の順序は次の通りです。               ―・    宣言文         |    実行文]−プログラム部分|―プログラム本体    END行        |               ―・ 6)主プログラム、副プログラム 主プログラム、副プログラムは同一プログラム内にあり、 両者は同じ扱いとなります。 変数も共用するので、COMMON文はありません。 主プログラムと副プログラムの区別はプログラマーで決定され、 別の見方をするとBASICでいうGOSUB−RETURN の関係と同じです。 したがって、主と副の区別が明確でないため、 プログラム単位としてはっきり識別できません。 プログラム単位は主プログラム、または副プログラムをいいます。 プログラム単位における最後の実行文は必ず、 次のいずれかでなければなりません。 ・――――――――――――――――――・ | ●GOTO文  ●STOP文   | | ●IF文    ●RETURN文 | ・――――――――――――――――――・ 7)FORM言語の要素   (1)文   FORMの文は実行文と非実行文とに大別されます。   ・――――――――――――――――――――――――――――――――――・   |                                  |   |        ・―代入文――――――――――算術代入文      |   |        |                         |   |   ・―実行文+―制御文――――――――+―GOTO文      |   |   |    |            |―IF文        |   |   |    ・―入出力文       |―DO文        |   |   |      |          |―CONTINUE文  |   |   |      |―READ文    |―CALL文      |   | 文―|      |―WRITE文   |―PAUSE文     |   |   |      |―SETG文    |―STOP文      |   |   |      ・―RESG文    |―RETURN文    |   |   |                 |―BREAK文     |   |   |                 ・―USR文       |   |   |                              |   |   ・―非実行文――宣言文―――――――+―DIMENSION文 |   |                     ・―END文       |   |                                  |   ・――――――――――――――――――――――――――――――――――・   (2)数値の内部表現     内部で扱える数値は16bitで、     符号付きの場合は−32,767〜+32,767、     文番号などの符号なしの場合は0〜65,534までです。     文字については8bitです。     ・――――――――――――――――――――――――・     |   ・―――――――・            |     | 数字|   |   | 2バイト16bit   |     |   ・―――――――・            |     |   ・―――・                |     | 文字|   |     1バイト8bit   |     |   ・―――・                |     ・――――――――――――――――――――――――・   (3)定数     定数は値そのものを表わすデータ、     すなわち名前そのものが値を持つデータです。     FORMで扱う定数は、10進整数、10進定数です。   (4)変数     変数とは名前によって識別されるデータをいいます。     このの値はプログラム中で別の値に定義することができます。     変数名の付け方は次の通りです。      ●1〜4文字の一連の英数字      ●最初の文字は必ず英字であること。      ●予約語は変数名として用いてはならない。   (5)配列     配列とはいくつもの同じ変数に対して、     それぞれ異なった変数名を付けず全体を一つの集合とみなして     全体に一つの名前(配列名)を付けたものです。     配列の定義は DIMENSION文によって宣言します。   (6)配列要素     配列要素は1次元と2次元のみとることができます。     1次元は2,047まで、2次元は2,047まで指定できるが、     一方の添字は 255までしか許されません。   (7)配列の添字     添字は定数、変数、一般式いずれでもかまいません。     ただし、配列要素に0というのは存在しません。   (8)算術式     算術演算子は優先順位を持っており、式の中にいくつかの演算子がある場合、     優先の高いものから順に実行されます。     同一順位の演算子に対しては、左から右へ実行されます。     ・――――――――――――――――――――・     |                    |     |     + ←加算          |     |     − ←減算          |     |     * ←乗算          |     |     / ←除算          |     |                    |     |       ――――         |     |  式―――|FACT|――――――  |     |    |  ――――   |     |     |    |         |     |     |    | ・―|*|―・ |     |     |    |―|     |←|     |     |    | ・―|/|―・ |     |     |    |         |     |     |    | ・―|+|―・ |     |     |    ・―|     |←・     |     |      ・―|−|―・       |     |                    |     ・――――――――――――――――――――・ 9)代入文 代入文は演算の結果をある特定の変数に代入します。 一般型は次の通りです、 ・―――――――――――――――――・ |  v=al           | ・―――――――――――――――――・ vは変数、配列、メモリ・ファンクション、 またはI/Oファンクション、 alは算術式を表わします。 10)制御文 制御文とはプログラムの一部を多数回反復したり、 途中の演算結果によってプログラムの流れを変える場合に使います。   (1)GOTO文     GOTO文はプログラムの実行の順序を変更するときに使用します。     ・―――――――――――――――――・     | GOTO n          |     ・―――――――――――――――――・     nはプログラマーか付けた文番号です。   (2)IF文     IF文はある式の値を評価して、正、零、負のときの飛び先を     文番号で指定し、各文番号の付いている文ヘジャンプします。                      一般型は、次の通りです。     ・―――――――――――――――――・     | IF(exp)z,y,z    |     ・―――――――――――――――――・     IFの後に式を書き、( )で囲み、z,y、zは     飛び先の文番号で、負、零、正の順で並びます。     ・―――――――――――――――――――・     | 例 IF(I−J)10,20,30 |     |       ↑  ↑  ↑  ↑  |     |       式  負  零  正  |     ・―――――――――――――――――――・     IF文の変形として次のようなものがあります。     ・―――――――――――――――――・     | 例 IF(exp),,n    |     |   IF(exp)n,,    |     |   IF(exp),n,n   |     ・―――――――――――――――――・     番号を省略すると下の行へ流れます。   (3)DO文     DO文は指定した文番号との間を、ループの指定回数だけ繰り返します。     ・―――――――――――――――――・     | DO x v=n,m,l    |     ・―――――――――――――――――・     xはループするための端末文の文番号で、vは変数です。     nは開始値、mはループの終了値、lは増分パラメータです。     ただし、増分パラメータが1の場合のみ省略することができます。     また、lは負であってはいけません。     ・――――――――――――――――――――・     |    DO 10 I=1,100,1 |     |          |         |     | 10 CONTINUE        |     ・――――――――――――――――――――・     DO文で端末文に指定した文番号は、     どのDO文より下になければならず、またネスティングする場合、     完全に入れ子になっていなければなりません。     ・―――――――――――――――――――――――・     |    DO 10 I=1,100――――・ |     |    DO 20 J=1,200――・ | |     |        :          | | |     | 20 CONTINUE―――――――・ | |     |        :            | |     | 10 CONTINUE―――――――――・ |     ・―――――――――――――――――――――――・     a)DO文のネスティングは6重まで処理できます。     b)DO文の範囲内から外へ飛び出すことはできるが、       外より飛び込むことはできません。     c)DO文の端末文は、DO文、IF文、GOTO文,       STOP文、RETURN文を指定することができません。       通常、端末文にはCONTINUE文を使用しますが、       上記以外の実行文であればかまいません。       また、1つの端末文を多数のDO文の端末文として使うこともできます。       ・―――――――――――――――――――――・       |   DO 10 I=1,100―――・ |       |   DO 20 J=1,100―・ | |       |         :       | | |       |10 CONTINUE――――――+―・ |       ・―――――――――――――――――――――・     d)DO文で使用している変数はその範囲内で、       その変数に代入することはできません。       また、DO文の多重ループを行なうとき、       その変数はすべて違う変数名を用いなければなりません。   (4)CONTINUE文     この文はプログラム中、どこにあっても何も実行しませんが、     DOの端末文、GOTO、IFなどの飛び先としても使用できます。   (5)CALL文     この文は指定文番号を、副プログラムの先頭とみなしてコールします。     変数は主プログラムと共用します。   (6)RETURN文     CALL文で呼ばれた副プログラムの最後に書き、     この文が実行されるとCALL文の次の文へ戻ります。   (7)PAUSE文     この文を実行するとプログラムはそこで一時停止します。     この状態でキーを押すと、次の文から実行を再開します。     ・―――――――――――――――――・     |  例  PAUSE n     |     ・―――――――――――――――――・     nはプログラマーが任意に付ける数字です。     この文が実行されると 『PAUSE n』が出力され、     一時停止します。     nはどこのPAUSE文 かを知らせるための番号であるため、     任意に付けてかまいません。     必要なければnは省略可能です。     また、停止した状態では、[BREAK]キー が受け付けられます。   (8)STOP文     この文はプログラムの実行を停止させるときに使用します。     STOP文はプログラム中どこに入れてもかまいません。     ・―――――――――――――――――・     |  例  STOP n      |     ・―――――――――――――――――・     nの関係はPAUSE文 と同じです。   (9)BREAK文     [BREAK]キー のチェックのための文です。     [BREAK]キー が押されなければ、何も実行しません。     この文は端末文としても使用可能である。   (10)USR文     この文はマシン語とリンクするときに使用します。     ・―――――――――――――――――・     | 例 USR(exp)      |     ・―――――――――――――――――・     expで指定されるアドレスをサブルーチン・コールします。     各レジスタ(AF,BC,DE,HL)はプログラム中で決めることができ、     RETURNしたときのレジスタヘの受け渡しはメモリを介して行なうので、     MEM関数 によってセットします。     各レジスタのアドレスは以下の通り。     ・―――――――――――――――――・     | AF→1000H        |     | BC→1002H        |     | DE→1004H        |     | HL→1006H        |     ・―――――――――――――――――・     ただし、AF’,BC’,DE’,HL’,IX,IY,SPを     変えることはできません。   (11)END行     この行はソースの終りを示すのでコンパイラはこの行を見つけると     コンパイルを停止します。     この文には文番号を付けることができません。 11)入出力文 (1)SETG、RESG文   80×50の疑似グラフィックのセット、リセット文です。   ・―――――――――――――――――――・   | 例 SETG(exp1,exp2) |   |   RESG(exp1,exp2) |   ・―――――――――――――――――――・   exp1,exp2で指定される位置にオペレートします。   exp1は横方向で0〜79まで、exp2は0〜49までの範囲です。   exp1〜2は定数、変数、式です。 (2)READ文   キーから定数の入力を行ないます。   READ文中でのストリングス・プリントも可能です。   ・――――――――――――――――――――――――・   | 例 READ(v exp1,v1 exp2) |   ・――――――――――――――――――――――――・   vは変数名、配列要素、expは入力型指定です。   ・―――――――――――――――――・   | v.I  |10進入力      |   | v.B  |16進入力      |   | v.A1 |1文字入力     |   | v.A2 |2文字入力     |   | v,   |10進入力      |   | “ABC”|“ ”の中を出力  |   | /    |改行        |   ・―――――――――――――――――・   ・―――――――――――――――――――――――――――――――・   | 例 READ(/A.I,“NEXT”,B.B,C.A1/) |   ・―――――――――――――――――――――――――――――――・   入力要素は、『,』で区切り複数個書くことが可能です。 (3)WRITE文   WRITE文 は次のものを出力できます。   定数、変数、式の値の出力、スペースの出力、   CRの出力、文字コードの出力、カーソル位置の設定などです。   FORMAT文がないので、WRITE文 中ですべて処理します。   ・―――――――――――――――――――――――――――――――――――――・   |例 WR1TE(/10*A.I10,A/B.B4,10.X,“ABC”/)|   ・―――――――――――――――――――――――――――――――――――――・   ・―――――――――――――――――――――――――――・   |EXP        |10進左づめ表示        |   |EXP.In     |n桁の10進右づめ表示     |   |EXP.B2     |16進2桁表示         |   |EXP.B4     |16進4桁表示         |   |EXP.X      |EXPの数だけスペースを出力 |   |EXP.A1     |1文字出力          |   |EXP.A2     |2文字出力          |   |EXP.V      |カーソル・バーチカル・セット |   |EXP.H      |カーソル・ホリゾンタル・セット|   |  “strings”|文字列出力          |   |/          |改行             |   ・―――――――――――――――――――――――――――・   EXPは定数、変数、式などです。   なお、0.A1でCRTをセット、   1.A1でプリンタをセットすることができます。   各要素は『,』で区切ることができるが、   /(改行)だけは区切る必要がありません。 12)基本関数 FORMの持っている関数は以下の通りです。 ・―――――――――――――――――――――――――――――――・ |●MEM(exp)      ●ABS(exp)       | |●IOC(exp)      ●GET            | |●MOD(exp1,exp2)●LOW(exp)       | |●RND(exp)      ●SIGN(exp1,exp2)| ・―――――――――――――――――――――――――――――――・ (1)MEM   MEM関数はexpで指定されたメモリをアクセスします。   ・―――――――――――――――――・   lv=MEM(exp)       |   |MEM(exp)=exp1    |   ・―――――――――――――――――・   MEMを右辺に置くか左辺に置くかによって機能が変わります。   前者はPEEK的、後者はPOKE的機能を待ちます。   POKE機能の場合、exp1は0〜 255まで使用でき、   それを越える場合には上位8bitは無視されます。 (2)IOC   I/Oポートをアクセスします。   ・―――――――――――――――――・   | v=IOC(exp)      |   | IOC(exp)=exp1   |   ・―――――――――――――――――・   使用方法はMEMと同じです。 (3)MOD   MODは除算時の余りを与えます。   ・―――――――――――――――――・   | 例 MOD(exp,exp1) |   ・―――――――――――――――――・   余りはexp/exp1のそれです。 (4)RND   この関数は乱数を与えます。   ・―――――――――――――――――・   | 例 RND(exp)      |   ・―――――――――――――――――・   乱数は0〜exp−1までの数です。   expの上限は32,767までです。 (5)ABS   ・―――――――――――――――――・   | 例 ABS(exp)      |   ・―――――――――――――――――・   この関数はexpの絶対値を与えます。 (6)GET   キーからリアルタイム入力を行ないます。   GET実行中、キー入力があれば対応するASCIIコードの値を持ちます。   入力がなければ0を返します。   ・―――――――――――――――――・   | 例 v=GET         |   |   v=GET+exp     |   ・―――――――――――――――――・ (7)LOW   ・―――――――――――――――――・   | 例 LOW(exp)      |   ・―――――――――――――――――・   expの下位バイトを取った値を持ちます。   expは−32,767〜32,767までで、   この関数が持つのは0〜 255までです。 (8)SIGN   ・―――――――――――――――――――・   | 例 SIGN(exp1,exp2) |   ・―――――――――――――――――――・   exp1にexp2の持つ符号を与えます。   この関数が持つ値はexp2の符号の付いたexp1である。 以上がFORMの侍つ関数であり算術式の中で自由に使用できる。 式においては、*、/が+、−より先に演算され、 ( )が付いているときのみそれが優先されます。 ( )は6重まで許されます。 ――――――――――――――――――― 6 エラーメッセージ ――――――――――――――――――― FORMコンパイラの次のようなエラーコードを表示します。 ・―――――――――――――――――・ | ERROR n         | ・―――――――――――――――――・ nはエラーコードで数字が出力されます。 (1)ERROR2   パラメータ誤まり、または配列の添字の誤まりがある場合。 (2)ERROR3   文番号の2重定義の場合。 (3)ERROR4   DIMENSION文 の出てくるところがおかしいとき。 (4)ERROR5   文法上のエラーの場合。 (5)ERROR6   DOの多重ループが6重以上となっている場合。 (6)ERROR7   変数名がおかしい。   たとえば4文字以上の名前を付けたとき。 (7)ERROR8   DIMENSION 内でのエラー。   宣言時に 2,047以上の添字を付けたとき。 (8)ERR DO LOOP   DOループがおかしいとき。 (9)MEMORY SIZE OVER ABORT   メモリ・サイズをオーバーしたとき。 (10)ST NO,NOT FOUND   飛び先番号がない場合。 ――――――――――――――――――― 7最後に ――――――――――――――――――― 最後にメモリ・ダンプのサンプル・プログラムと FORM自身のダンプ・リストを載せておきます。 このリストはそのまま入れると完全に動きますが、 1200Hから始まっているので、 マシン・ラングージ・モニタ SP-2001では入りません。 このリストを入れる方は簡単な、モニタ・プログラムをメモリの後に作って、 それで入れてください。 FORMはメモリやI/Oの操作性をある程度考慮して作っているので、 高速性を要求するような用途に利用できます。